package com.example.demo.algorithm;

/**
 * 输入一个链表,反转链表后,输出链表的所有的元素
 *
 * 问题分析:这道题,说白了,就是如何让后一个节点指向前一个节点,在下面的代码中定义一个Next节点,该节点主要是保存要
 * 反转到头的那个节点,防止链表"断裂".
 */
public class Test01 {

    public static void main(String[] args) {

        ListNode a = new ListNode(1);
        ListNode b = new ListNode(2);
        ListNode c = new ListNode(3);
        ListNode d = new ListNode(4);
        ListNode e = new ListNode(5);
        a.next = b;
        b.next = c;
        c.next = d;
        d.next = e;
        new  Solution().ReverseList(a);
        while (e!=null){
            System.out.println(e.val);
            e = e.next;
        }
    }
}

class  ListNode{
    int val;
    ListNode next = null;

    ListNode(int val){
        this.val = val;
    }
}

class  Solution{
    public  ListNode ReverseList(ListNode head) {

        ListNode next = null;
        ListNode pre = null;

        while (head!=null){
            //保存要反转的头节点
            next = head.next;
            //要反转的那个节点指向已经反转的上一个节点(备注;第一个节点反转会执行null)
            head.next = pre;
            //上一个节点已经饭庄到头部的节点
            pre = head;
            //一致向尾节点走
            head = next;
        }
        return  pre;

    }
}

